package main

import "fmt"

func main() {
	stringIsSlice()
	updateStringSlice()
	//fmt.Println(testFbn(10))

}

// stringIsSlice
//
//	@Description:  string底层是一个[]byte  本质是切片，string是不可变的
func stringIsSlice() {
	fmt.Println("-------------string底层是一个[]byte-------------")
	//string底层是一个[]byte  本质是切片，string是不可变的
	str := "hello@hello@world"
	slice := str[6:]   //从index=6开始切片
	fmt.Println(slice) //hello@world

}

// updateStringSlice
//
//	@Description: 修改string的两种方式：
//
// 1 string ->[]byte ->string
// 2 string ->[]byte ->string
func updateStringSlice() {
	fmt.Println("-------------修改string的两种方式-------------")
	//修改 string: string ->[]byte ->string
	str := "hello@hello@world"
	slice := []byte(str) //转为[]byte
	slice[0] = 'Z'
	str = string(slice)
	fmt.Println(str) //Zello@hello@world

	//修改 string: string ->[]byte ->string
	slice1 := []rune(str)
	slice1[0] = 'H'
	str = string(slice1)
	fmt.Println(str) //Hello@hello@world
}

// 斐波那契数列
func testFbn(n int) []uint64 {
	slice := make([]uint64, n)
	for i := 1; i <= n; i++ {
		if i == 1 || i == 2 {
			slice[i-1] = 1
		} else {
			slice[i-1] = slice[i-2] + slice[i-3]
		}
	}
	return slice
}

func fbn(n int) int {
	if n == 1 || n == 2 {
		return 1
	}
	return fbn(n-1) + fbn(n-2)
}
